home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #5
/
Amiga Plus CD - 2000 - No. 5.iso
/
Tools
/
Dev
/
FPSE_src
/
mem.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-01-01
|
8KB
|
268 lines
/*
Memory addressing
=================
Written by BERO
Modified by LDChen
- Thanks to ROOR for the suggestions.
*/
#include "fpse.h"
// #define SHOW_READ
// #define SHOW_WRITE
// #define ENABLE_AR_EMULATION
#define MAXMEM 0x2000
void printpc(void);
static int writeok=1;
static UINT8 *memPSXrd[MAXMEM];
static UINT8 *memPSXwr[MAXMEM];
static void mem_ctrl(UINT32 data)
{
int x;
/* LbV tbV pH */
PRINTF("memctrl %08x\n",(int)data);
switch(data) {
case 0x00000800:
case 0x00000804:
/* LbV ð 0x0000000? */
writeok = 0;
break;
case 0x0001e988:
/* C */
writeok = 1;
break;
default:
printf("unknown memctrl %08x\n",(int)data);
break;
}
if (writeok) {
for (x=0; x<0x80; x++)
memPSXwr[x] = ram + (x & 0x1F) * 0x10000;
} else {
for (x=0; x<0x80; x++)
memPSXwr[x] = NULL;
}
}
static char extrom_init[0x100] = {
0xb4,0x00,0x00,0x1f,0x4c,0x69,0x63,0x65,0x6e,0x73,0x65,0x64,0x20,0x62,0x79,0x20,
0x53,0x6f,0x6e,0x79,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x45,0x6e,
0x74,0x65,0x72,0x74,0x61,0x69,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x49,0x6e,0x63,0x2e,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xb4,0x00,0x00,0x1f,0x4c,0x69,0x63,0x65,0x6e,0x73,0x65,0x64,0x20,0x62,0x79,0x20,
0x53,0x6f,0x6e,0x79,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x45,0x6e,
0x74,0x65,0x72,0x74,0x61,0x69,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x49,0x6e,0x63,0x2e,
0x00,0x00,0x00,0x00,0x08,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void memalloc(void)
{
int x;
// ram rom extrom scratchpad
ram = malloc(0x200000+0x80000+0x20000+0x10000);
memset(ram,0,0x200000+0x80000+0x20000+0x10000);
rom = ram + 0x200000;
extrom = rom + 0x80000;
scratchpad = extrom + 0x20000;
memset(extrom,0xff,0x20000);
memcpy(extrom,extrom_init,sizeof(extrom_init));
for (x=0; x<MAXMEM; x++)
{
if (x>=0x0000 && x<0x0080)
memPSXwr[x] = memPSXrd[x] = ram + (x & 0x1F) * 0x10000;
else
if (x>=0x1fc0 && x<0x1fc8)
{
memPSXrd[x] = rom + (x & 0x07) * 0x10000;
memPSXwr[x] = NULL;
}
else
if (x>=0x1f00 && x<0x1f02)
memPSXwr[x] = memPSXrd[x] = extrom + (x & 0x01) * 0x10000;
else memPSXwr[x] = memPSXrd[x] = NULL;
}
memPSXwr[0x1F80] = memPSXrd[0x1F80] = scratchpad;
}
void memfree(void)
{
free(ram);
}
UINT8 read8(UINT32 adr)
{
UINT8 *Pointer;
Pointer = memPSXrd[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_READ
PRINTF("%08x: READ8 [%08x]=%02x\n",PC,adr,Pointer[adr & 0xffff]);
#endif
if (adr>=0x1f801000 && adr<0x1f808000) return hw_read8(adr);
else return Pointer[adr & 0xFFFF];
} else {
#ifdef ENABLE_AR_EMULATION
if (adr>=0x1f000000 && adr<0x1f100000) return hw_romread(adr);
#endif
printpc();
printf("can't read8 %08x at %08x\n",(int)adr,(int)PC);
return -1;
}
}
UINT16 read16(UINT32 adr)
{
UINT8 *Pointer;
Pointer = memPSXrd[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_READ
PRINTF("%08x: READ16 [%08x]=%04x\n",
PC,adr,*(UINT16 *)(Pointer + (adr & 0xFFFF));
#endif
if (adr>=0x1f801000 && adr<0x1f808000) return hw_read16(adr);
else return SWAP16(*(UINT16 *)(Pointer + (adr & 0xFFFF)));
} else {
printpc();
printf("can't read16 %08x at %08x\n",(int)adr,(int)PC);
return -1;
}
}
UINT32 read32(UINT32 adr)
{
UINT8 *Pointer;
Pointer = memPSXrd[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_READ
PRINTF("%08x: READ32 [%08x]=%08x\n",
PC,adr,*(UINT32 *)(Pointer + (adr & 0xFFFF));
#endif
if (adr>=0x1f801000 && adr<0x1f808000) return hw_read32(adr);
else return SWAP32(*(UINT32 *)(Pointer + (adr & 0xFFFF)));
} else {
printpc();
printf("can't read32 %08x at %08x\n",(int)adr,(int)PC);
return -1;
}
}
void write8(UINT32 adr,UINT32 data)
{
UINT8 *Pointer;
Pointer = memPSXwr[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_WRITE
PRINTF("%08x: WRITE8 [%08x]=%02x\n",PC,adr,data);
#endif
Pointer[adr & 0xFFFF] = (UINT8)(data);
// CompileFlush(adr,adr);
if (adr>=0x1f801000 && adr<0x1f808000) hw_write8(adr,data);
} else {
#ifdef ENABLE_AR_EMULATION
if (adr>=0x1f000000 && adr<0x1f100000) hw_romwrite(adr,data);
else
#endif
{
printpc();
printf("can't write8 %08x at %08x\n",(int)adr,(int)PC);
}
}
}
void write16(UINT32 adr,UINT32 data)
{
UINT8 *Pointer;
Pointer = memPSXwr[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_WRITE
PRINTF("%08x: WRITE16 [%08x]=%04x\n",PC,adr,data);
#endif
// CompileFlush(adr,adr);
*(UINT16 *)(Pointer + (adr & 0xFFFF)) = SWAP16((UINT16)(data));
if (adr>=0x1f801000 && adr<0x1f808000) hw_write16(adr,data);
} else {
printpc();
printf("can't write16 %08x at %08x\n",(int)adr,(int)PC);
}
}
extern int writebreak;
void write32(UINT32 adr,UINT32 data)
{
UINT8 *Pointer;
Pointer = memPSXwr[(adr >> 16)&(MAXMEM-1)];
if (Pointer != NULL) {
#ifdef SHOW_WRITE
PRINTF("%08x: WRITE32 [%08x]=%08x\n",PC,adr,data);
#endif
// CompileFlush(adr,adr);
*(UINT32 *)(Pointer + (adr & 0xFFFF)) = SWAP32(data);
if (adr>=0x1f801000 && adr<0x1f808000) hw_write32(adr,data);
} else {
if (adr==0xfffe0130) mem_ctrl(data);
else if (writeok) {
printpc();
printf("can't write32 %08x at %08x\n",(int)adr,(int)PC);
}
}
}
void *baseaddr(UINT32 adr)
{
if ((adr>=0x80000000 && adr<0x80800000) ||
(adr>=0xa0000000 && adr<0xa0800000) ||
(adr>=0x00000000 && adr<0x00800000)) return ram - (adr&~0x1fffff);
if ((adr>=0xbfc00000 && adr<0xbfc80000) ||
(adr>=0x1fc00000 && adr<0x1fc80000) ||
(adr>=0x9fc00000 && adr<0x9fc80000)) return rom - (adr & ~0x7FFFF);
else if (adr>=0x1f800000 && adr<0x1f801000) return scratchpad - 0x1f800000;
else if (adr>=0x1f000000 && adr<0x1f020000) return extrom - 0x1f000000;
else { FPSE_Flags |= STOP;
printpc();
printf("can't exec %08x\n",(int)adr);
}
return NULL;
}
#if 0
void *baseaddr2(UINT32 adr)
{
if ((adr>=0x80000000 && adr<0x80800000) ||
(adr>=0xa0000000 && adr<0xa0800000) ||
(adr>=0x00000000 && adr<0x00800000)) return ram - (adr&~0x1fffff);
if ((adr>=0xbfc00000 && adr<0xbfc80000) ||
(adr>=0x1fc00000 && adr<0x1fc80000) ||
(adr>=0x9fc00000 && adr<0x9fc80000)) return rom - (adr & ~0x7FFFF);
else if (adr>=0x1f800000 && adr<0x1f801000) return scratchpad - 0x1f800000;
return NULL;
}
#endif